package com.fdb.efp.nls.service.impl.psd;

import com.fdb.basic.framework.core.constant.EsbRetCodeStandard;
import com.fdb.basic.framework.core.exception.BizException;
import com.fdb.basic.framework.core.util.DateUtility;
import com.fdb.efp.nls.service.facade.psd.PsdSyncPrdInfoLprService;
import com.fdb.efp.nls.service.facade.PrdInfoLprService;
import com.fdb.efp.nls.service.facade.PrdInfoLprTempService;
import com.fdb.efp.nls.service.vo.PrdInfoLprTempVO;
import com.fdb.efp.esb.common.constant.EsbBizEnums;
import com.fdb.efp.esb.common.constant.loan.PerLoanIntRtCdEnum;
import com.fdb.efp.esb.service.bo.req.loan.PerLoanSysPrdInfoLprReqBean;
import com.fdb.efp.esb.service.bo.resp.loan.PerLoanSysPrdInfoLprRespBean;
import com.fdb.efp.esb.service.facade.loan.PerLoanSysPrdInfoLprService;
import com.fdb.efp.nls.service.facade.NlsQueueSoltComnService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 需求编号：【2019D1218】（普税贷需求）
 * 问题编号：【2019D1218】（同步个贷系统产品信息lpr利率信息）
 * 开发人员：【ludayong】
 * 创建日期：【2020/3/27 13:00】
 * 功能描述：
 * 修改日期：【2020/3/27 13:00】
 * 修改描述：
 */
@Service("psdSyncPrdInfoLprService")
public class PsdSyncPrdInfoLprServiceImpl implements PsdSyncPrdInfoLprService {

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（同步个贷系统产品信息lpr利率信息）
     * 开发人员：【ludayong】
     * 创建日期：【2020/3/27 13:00】
     * 功能描述：
     * 修改日期：【2020/3/27 13:00】
     * 修改描述：
     */
    @Override
    public Boolean syncPerLoanSysPrdInfoLpr() throws Exception {
        Boolean result = false;
        logger.info("同步个贷系统产品信息lpr利率信息任务处理开始...");
        try {
            invokePerLoanSysPrdInfoLpr();
        } catch (Exception e) {
            nlsQueueSoltComnService.alarmNotice(EsbBizEnums.AlarmObjectName.OCM_REAL_TIME.getValue(), EsbBizEnums.AlarmLvl.SERIOUS.getValue(), e.getMessage());
            throw e;
        }
        result = true;
        logger.info("同步个贷系统产品信息lpr利率信息任务处理结束...");
        return result;
    }

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（若不是因为修复问题而新增该类，则留空）
     * 开发人员：【ludayong】
     * 创建日期：【2020/3/31 14:13】
     * 功能描述：
     * 修改日期：【2020/3/31 14:13】
     * 修改描述：
     */
    private void invokePerLoanSysPrdInfoLpr() throws InterruptedException {
        // 查询利率信息
        int count = 0;
        while (count <= 5) {
            try {
                logger.info("同步个贷系统产品信息lpr利率信息任务第" + (count + 1) + "次处理开始...");
                processPerLoanSysPrdInfoLpr();
                break;
            } catch (Exception e) {
                if (count == 5) {
                    String message = e.getMessage();
                    nlsQueueSoltComnService.alarmNotice(EsbBizEnums.AlarmObjectName.OCM_REAL_TIME.getValue(), EsbBizEnums.AlarmLvl.SERIOUS.getValue(), message);
                }
                Thread.sleep(120000);
            }
            count++;
        }
    }

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（若不是因为修复问题而新增该类，则留空）
     * 开发人员：【ludayong】
     * 创建日期：【2020/3/31 14:13】
     * 功能描述：
     * 修改日期：【2020/3/31 14:13】
     * 修改描述：
     */
    private void processPerLoanSysPrdInfoLpr() throws Exception {
        Boolean isDel = false;
        // 利率信息查询请求信息
        PerLoanSysPrdInfoLprReqBean perLoanSysPrdInfoLprReqBean = new PerLoanSysPrdInfoLprReqBean();
        // 利率代码
        perLoanSysPrdInfoLprReqBean.setIntRtCd(PerLoanIntRtCdEnum.LPR.getValue());
        // 查询个贷利率信息
        PerLoanSysPrdInfoLprRespBean perLoanSysPrdInfoLprRespBean = Optional.ofNullable(perLoanSysPrdInfoLprService.applyPerLoanSysPrdInfoLpr(perLoanSysPrdInfoLprReqBean)).orElseGet(PerLoanSysPrdInfoLprRespBean::new);
        if (Objects.isNull(perLoanSysPrdInfoLprRespBean.getPLSRetInfArry()) || perLoanSysPrdInfoLprRespBean.getPLSRetInfArry().length < 0) {
            logger.error("调用个贷利率信息查询接口异常！");
            throw new Exception("调用个贷利率信息查询接口异常！");
        }
        // 先清空临时表信息
        if (!isDel) {
            int num = prdInfoLprTempService.deleteAllPrdInfoLprTemp();
            if (num == -1) {
                String msg = "清空个贷利率信息临时表出错！";
                logger.error(msg);
                throw new BizException(EsbRetCodeStandard.SJCLYC.getValue(), msg);
            }
            isDel = true;
        }
        if (isDel) {
            // 新增或更新个贷利率信息到产品信息lpr利率临时表
            batchInsertPrdInfoLprTemp(perLoanSysPrdInfoLprRespBean);
        }
        if (isDel) {
            // 调用存储过程同步产品信息lpr利率临时表到产品信息lpr利率正式表
            prdInfoLprService.callProcPrdInfoLpr();
        }
    }

    /**
     * 需求编号：【2019D1218】（普税贷需求）
     * 问题编号：【2019D1218】（批量新增个贷利率信息到临时表）
     * 开发人员：【ludayong】
     * 创建日期：【2020/3/31 14:13】
     * 功能描述：
     * 修改日期：【2020/3/31 14:13】
     * 修改描述：
     */
    private void batchInsertPrdInfoLprTemp(PerLoanSysPrdInfoLprRespBean perLoanSysPrdInfoLprRespBean) throws Exception {
        PerLoanSysPrdInfoLprRespBean.PLSRetInfArry[] pLSRetInfArry = perLoanSysPrdInfoLprRespBean.getPLSRetInfArry();
        // 数据为空不处理
        if (Objects.isNull(pLSRetInfArry) || pLSRetInfArry.length == 0) {
            return;
        }
        List<PerLoanSysPrdInfoLprRespBean.PLSRetInfArry> prdInfoLprs = Arrays.asList(pLSRetInfArry);
        // 个贷利率信息List
        List<PrdInfoLprTempVO> prdInfoLprTempList = prdInfoLprs.stream().filter(Objects::nonNull).map(perLoanSysPrdInfoLpr -> {
            PrdInfoLprTempVO prdInfoLprTempVO = new PrdInfoLprTempVO();
            // id           唯一标识
            prdInfoLprTempVO.setId(Integer.parseInt(perLoanSysPrdInfoLpr.getSoleIdNo()));
            // brcode       分行号或总行号,
            prdInfoLprTempVO.setBrcode(perLoanSysPrdInfoLpr.getBrchCd());
            // intratecd    利率代码，003-LPR利率,
            prdInfoLprTempVO.setIntratecd(perLoanSysPrdInfoLpr.getIntRtCd());
            // curcd        币种，CNY-人民币,
            prdInfoLprTempVO.setCurcd(perLoanSysPrdInfoLpr.getCcy());
            // effect_date  生效日期,
            if (Objects.nonNull(perLoanSysPrdInfoLpr.getEfftvDt())) {
                prdInfoLprTempVO.setEffectDate(DateUtility.parseDate(perLoanSysPrdInfoLpr.getEfftvDt(), TIME_FORMATE_PATTERN));
            }
            // expire_date  失效日期,
            if (Objects.nonNull(perLoanSysPrdInfoLpr.getInvalDt())) {
                prdInfoLprTempVO.setExpireDate(DateUtility.parseDate(perLoanSysPrdInfoLpr.getInvalDt(), TIME_FORMATE_PATTERN));
            }
            // term         适用期限，2-六个月至一年（含），3-一年至三年（含），4-三年至五年（含），5-五年以上,
            prdInfoLprTempVO.setTerm(perLoanSysPrdInfoLpr.getTrm());
            // unit         利率单位,
            // intrate      利率
            if (Objects.nonNull(perLoanSysPrdInfoLpr.getIntRt())) {
                prdInfoLprTempVO.setIntrate(new BigDecimal(perLoanSysPrdInfoLpr.getIntRt()));
            }
            // yr_intrate   利率
            // cnf_no
            prdInfoLprTempVO.setCnfNo("-");
            // sts char     状态，1-可用，0-不可用
            prdInfoLprTempVO.setSts("1");
            // upd_dt date 更新日期
            if (Objects.nonNull(perLoanSysPrdInfoLpr.getInfUdtDt())) {
                prdInfoLprTempVO.setUpdDt(DateUtility.parseDate(perLoanSysPrdInfoLpr.getInfUdtDt(), TIME_FORMATE_PATTERN));
            }
            // upd_tlr 		更新柜员号
            prdInfoLprTempVO.setUpdTlr(perLoanSysPrdInfoLpr.getNwstUdtTlrNo());
            return prdInfoLprTempVO;
        }).collect(Collectors.toList());

        if (Objects.isNull(prdInfoLprTempList) || prdInfoLprTempList.isEmpty()) {
            return;
        }
        // 批量新增个贷利率信息到临时表
        int num = prdInfoLprTempService.batchInsertPrdInfoLprTemp(prdInfoLprTempList);
        if (num == -1) {
            String msg = "批量新增个贷利率信息到临时表出错！";
            logger.error(msg);
            throw new BizException(EsbRetCodeStandard.SJCLYC.getValue(), msg);
        }
    }

    private static Logger logger = LoggerFactory.getLogger(PsdSyncPrdInfoLprServiceImpl.class);

    // 时间格式
    public final static String TIME_FORMATE_PATTERN   = "yyyyMMdd";

    @Autowired
    @Qualifier("prdInfoLprService")
    private PrdInfoLprService prdInfoLprService;

    @Autowired
    @Qualifier("prdInfoLprTempService")
    private PrdInfoLprTempService prdInfoLprTempService;

    @Autowired
    @Qualifier("perLoanSysPrdInfoLprService")
    private PerLoanSysPrdInfoLprService perLoanSysPrdInfoLprService;

    @Autowired
    @Qualifier("nlsQueueSoltComnService")
    private NlsQueueSoltComnService nlsQueueSoltComnService;
}
